package com.dc.designPattern._1_singleton.extend.extend2;

/**
 * Description: 单例模式_枚举实现（最优）
 *
 *  这种实现方式，既可以避免多线程同步问题；还可以防止通过反射和反序列化来重新创建新的对象。
 *  因为Java虚拟机会保证枚举类型不能被反射并且构造函数只被执行一次,因此每一个枚举类型和定义的枚举变量在JVM中都是唯一的。
 *
 * @author: gdc
 * @date: 2021/8/4
 * @version 1.0
 */
public class SingletonExtend2 {

    /**
     * 私有构造函数
     */
    private SingletonExtend2() {
    }

    /**
     * 是通过私有内部枚举类，来获取当前类的实例
     * @return              当前类实例
     */
    public static SingletonExtend2 getInstance() {
        return SingletonEnum.INSTANCE.getInstance();
    }

    /**
     * 私有的单例枚举
     */
    private enum SingletonEnum{

        /**
         * 单实例信息
         */
        INSTANCE;

        private SingletonExtend2 singleton;

        /**
         * JVM 来保证这个函数只会被执行一次
         *
         */
        SingletonEnum() {
            singleton = new SingletonExtend2();
        }

        /**
         * 用于外部类，通过此方法获取实例信息
         */
        public SingletonExtend2 getInstance() {
            return singleton;
        }
    }
}
